package com.imarkket;

import android.R.*;
import android.app.Activity;
import android.app.DialogFragment;
import android.app.ListActivity;
import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.widget.Adapter;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import com.imarkket.Dialogs.c_dialog_Alert;
import com.imarkket.Dialogs.c_dialog_NewLista;
import com.imarkket.Dialogs.c_dialog_NewProducto;
import com.imarkket.Dialogs.c_dialog_Salir;
import com.imarkket.Library.c_app_status;
import com.imarkket.Library.c_logging;
import com.imarkket.Library.c_shopping_list_adapter;
import com.imarkket.Library.c_shopping_list_product_adapter;
import com.imarkket.sqlite.handler.c_bd_handler;
import com.imarkket.sqlite.model.t_lista;
import com.imarkket.sqlite.model.t_lista_producto;
import com.imarkket.sqlite.model.t_producto;

/**
 * Created by Sistemas on 23/05/2014.
 */
public class c_shopping_list_prod
        extends ListActivity
        implements
        c_dialog_NewProducto.ListenerInterface,
        c_dialog_Alert.ListenerInterface {

    static Context context;
    c_bd_handler BD;

    int shopping_list_Item_Selected = -1;
    String shopping_list_Item_Count = "vacio";
    String shopping_list_Item_HASH = "vacio";
    String shopping_list_Item_Title = "vacio";
    String shopping_list_Product_Selected = "vacio";
    String shopping_list_Product_Selected_hash = "vacio";
    int shopping_list_Product_Selected_hash_count = 0;

    String ListaHASH = "vacio";
    String ProductoHASH = "vacio";

    Integer RETURN_CODE_OK = 0;

    @Override
    // Alert ok
    public void onSubmitListenerInterface_OK(DialogFragment dialog) {
        // User touched the dialog's positive button
        c_logging.getInstance().log(c_logging.LOG_INFO, getString(R.string.st_la_OK));
    }

    @Override
    public void onSubmitListenerInterface_NewProducto(String pPRODUCTO, int PickerValue) {

        c_logging.getInstance().log(c_logging.LOG_INFO, "Nuevo producto: " + pPRODUCTO);
        c_logging.getInstance().log(c_logging.LOG_INFO, "Count Producto: " + PickerValue);

        // Calculo el número de productos de todas mis listas
        int TotalProductos = BD.fnc_get_All_T_PRODUCTO().size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Antes productos: " + TotalProductos);

        // Calculo el número de relaciones listas y productos
        int TotalRelacionesListas_y_Productos = BD.fnc_get_All_T_LISTA_PRODUCTO("").size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Antes listas_y_producto: " + TotalRelacionesListas_y_Productos);

        // Calculo el número de productos de esa lista
        int TotalProductosLista = BD.fnc_get_All_T_LISTA_PRODUCTO(ListaHASH).size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Antes listas (" + ListaHASH + "): " + TotalProductosLista);

        // Calculo el número de listas
        int TotalListas = BD.fnc_get_All_T_LISTA().size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Antes listas: " + TotalListas);

        //////////////////////////////////////////// PROCESO INSERCION

        // Creamos el objeto producto
        t_producto producto = new t_producto(pPRODUCTO);

        // Calculamos el hash del producto
        ProductoHASH = producto.getADES_HASH();
        c_logging.getInstance().log(c_logging.LOG_INFO, "HASH Lista:    " + ListaHASH);
        c_logging.getInstance().log(c_logging.LOG_INFO, "HASH Producto: " + ProductoHASH);

        // Si el elemento no existe en la tabla de productos lo inserto sin problemas
        // (CASO 1)
        // --> insert en producto
        // --> insert en lista producto con x de cantidad
        // --> update en lista fecha y total lista con sum() de lista_producto ( lista, producto )
        // si el elemento existe (repetido) puede ser que:
        // --> si no está asociado a esa lista
        //     (CASO 2)
        //     --> update producto
        //     --> insert en lista producto con x de cantidad
        //     --> update lista fecha y total lista
        // --> si está asociado hacer
        //     (CASO 3)
        //     --> update producto
        //     --> update en lista_producto aumentando x
        //     --> update lista fecha y total lista

        Boolean existe_producto = false;
        Boolean existe_producto_en_lista = false;

        existe_producto = BD.fnc_find_producto_T_PRODUCTO(producto.getADES_HASH());
        existe_producto_en_lista = BD.fnc_find_producto_T_LISTA_PRODUCTO(ListaHASH, ProductoHASH);

        if (existe_producto) {
            c_logging.getInstance().log(c_logging.LOG_INFO, ProductoHASH + "producto en T_PRODUCTO --> SI");
            if (existe_producto_en_lista) {

                c_logging.getInstance().log(c_logging.LOG_INFO, "*************  CASO 3 **********************************");
                c_logging.getInstance().log(c_logging.LOG_INFO, ProductoHASH + "producto en T_LISTA_PRODUCTO (" + ListaHASH + ") --> SI");
                //     (CASO 3)
                //     --> update producto
                //     --> update en lista_producto aumentando x
                //     --> update lista fecha y total lista

                // Update el objeto a la lista de productos
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_PRODUCTO:      " + ProductoHASH);
                long id_producto = BD.fnc_update_table_producto(ProductoHASH);
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_PRODUCTO (id): " + id_producto);

                // Update el objeto lista_producto actualizando la cantidad
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA_PRODUCTO: " + ListaHASH + " " + ProductoHASH);
                int get_lista_producto_count = BD.fnc_count_producto_en_lista_producto(ListaHASH, ProductoHASH);
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA_PRODUCTO: " + ListaHASH + " " + ProductoHASH + " Count:       " + get_lista_producto_count);
                // PickerValue determina la cantidad de elementos insertados
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA_PRODUCTO: " + ListaHASH + " " + ProductoHASH + " PickerValue: " + PickerValue);
                int total_lista_producto = get_lista_producto_count + PickerValue;
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA_PRODUCTO: " + ListaHASH + " " + ProductoHASH + " Total:       " + total_lista_producto);
                long rows_affected = BD.fnc_update_table_lista_producto(ListaHASH, ProductoHASH, total_lista_producto);
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA rows affected                   " + rows_affected);

                // Update lista fecha
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH);
                int get_lista_count = BD.fnc_get_lista_count ( ListaHASH );
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH + " Count:       " + get_lista_count);
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH + " PickerValue: " + PickerValue);
                int total_lista = get_lista_count + PickerValue;
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH + " Total:       " + total_lista);
                rows_affected = BD.fnc_update_table_lista(ListaHASH, total_lista);
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA rows affected                   " + rows_affected);

            } else {

                c_logging.getInstance().log(c_logging.LOG_INFO, "*************  CASO 2 **********************************");
                c_logging.getInstance().log(c_logging.LOG_INFO, ProductoHASH + "producto en T_LISTA_PRODUCTO (" + ListaHASH + ") --> NO");
                // CASO 2 pertenece a otra lista y no a esta y por eso está en producto y no en lista_producto
                //     --> update producto
                //     --> insert en lista producto con x de cantidad
                //     --> update lista fecha y total lista

                // Update el objeto a la lista de productos
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_PRODUCTO:      " + ProductoHASH);
                long id_producto = BD.fnc_update_table_producto(ProductoHASH);
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_PRODUCTO (id): " + id_producto);

                // Creamos el objeto lista_producto y añadimos a la lista dicho objeto
                c_logging.getInstance().log(c_logging.LOG_INFO, "INSERT NEW T_LISTA_PRODUCTO:      " + ListaHASH + " " + ProductoHASH);
                // PickerValue determina la cantidad de elementos insertados
                t_lista_producto lista_producto = new t_lista_producto(ListaHASH, ProductoHASH, PickerValue);
                long id_lista_producto = BD.fnc_insert_table_lista_producto(lista_producto, ListaHASH, ProductoHASH);
                c_logging.getInstance().log(c_logging.LOG_INFO, "INSERT NEW T_LISTA_PRODUCTO (id): " + id_lista_producto);

                // Update lista fecha
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH);
                int get_lista_count = BD.fnc_get_lista_count ( ListaHASH );
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH + " Count:       " + get_lista_count);
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH + " PickerValue: " + PickerValue);
                int total_lista = get_lista_count + PickerValue;
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH + " Total:       " + total_lista);
                int rows_affected = BD.fnc_update_table_lista(ListaHASH, total_lista);
                c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA rows affected                   " + rows_affected);

            }
        } else {
            c_logging.getInstance().log(c_logging.LOG_INFO, "*************  CASO 1 **********************************");
            c_logging.getInstance().log(c_logging.LOG_INFO, ProductoHASH + "producto en T_PRODUCTO --> NO");
            // CASO 1
            // NO PUEDE DARSE EL CASO DE QUE NO EXISTA EL ELEMENTO Y ESTÉ ASOCIADO A ALGUNA LISTA
            // --> insert en producto
            // --> insert en lista producto con x de cantidad
            // --> update en lista fecha y total lista con sum() de lista_producto ( lista, producto )

            // Añadimos el objeto a la lista de productos
            c_logging.getInstance().log(c_logging.LOG_INFO, "INSERT NEW T_PRODUCTO:      " + ProductoHASH);
            long id_producto = BD.fnc_insert_table_producto(producto);
            c_logging.getInstance().log(c_logging.LOG_INFO, "INSERT NEW T_PRODUCTO (id): " + id_producto);

            // Creamos el objeto lista_producto y añadimos a la lista dicho objeto
            c_logging.getInstance().log(c_logging.LOG_INFO, "INSERT NEW T_LISTA_PRODUCTO:      " + ListaHASH + " " + ProductoHASH);
            // PickerValue determina la cantidad de elementos insertados
            t_lista_producto lista_producto = new t_lista_producto(ListaHASH, ProductoHASH, PickerValue);
            long id_lista_producto = BD.fnc_insert_table_lista_producto(lista_producto, ListaHASH, ProductoHASH);
            c_logging.getInstance().log(c_logging.LOG_INFO, "INSERT NEW T_LISTA_PRODUCTO (id): " + id_lista_producto);

            // Update lista fecha
            c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH);
            int get_lista_count = BD.fnc_get_lista_count ( ListaHASH );
            c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH + " Count:       " + get_lista_count);
            c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH + " PickerValue: " + PickerValue);
            int total_lista = get_lista_count + PickerValue;
            c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA: " + ListaHASH + " Total:       " + total_lista);
            int rows_affected = BD.fnc_update_table_lista(ListaHASH, total_lista);
            c_logging.getInstance().log(c_logging.LOG_INFO, "UPDATE T_LISTA rows affected                   " + rows_affected);
        }

        //////////////////////////////////////////// FIN PROCESO INSERCION

        // Calculo el número de productos de todas mis listas
        int TotalProductos_despues = BD.fnc_get_All_T_PRODUCTO().size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Antes productos: " + TotalProductos);
        c_logging.getInstance().log(c_logging.LOG_INFO, "Desp. productos: " + TotalProductos_despues);

        // Calculo el número de relaciones listas y productos
        int TotalRelacionesListas_y_Productos_despues = BD.fnc_get_All_T_LISTA_PRODUCTO("").size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Antes listas_y_producto: " + TotalRelacionesListas_y_Productos);
        c_logging.getInstance().log(c_logging.LOG_INFO, "Desp. listas_y_producto: " + TotalRelacionesListas_y_Productos_despues);

        // Calculo el número de productos de esa lista
        int TotalProductosLista_despues = BD.fnc_get_All_T_LISTA_PRODUCTO(ListaHASH).size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Antes listas (" + ListaHASH + "): " + TotalProductosLista);
        c_logging.getInstance().log(c_logging.LOG_INFO, "Desp. listas (" + ListaHASH + "): " + TotalProductosLista_despues);

        // Calculo el número de listas
        int TotalListas_despues = BD.fnc_get_All_T_LISTA().size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Antes listas: " + TotalListas);
        c_logging.getInstance().log(c_logging.LOG_INFO, "Desp. listas: " + TotalListas_despues);

        // Pintamos la pantalla - Refresh
        // Matriz Bidimensional
        // Matriz de n Elementos y 7 columnas (0 a 6), el total de características de cada producto
        String[][] MatrizBidimensional = new String[TotalProductosLista_despues][6];
        MatrizBidimensional = BD.fnc_export_lista_producto(TotalProductosLista_despues, ListaHASH);

        // Recargamos la lista
        // Ponemos más uno para que
        setListAdapter(new c_shopping_list_product_adapter(this, TotalProductosLista_despues, MatrizBidimensional));

        // Como estamos insertando hacemos invisible la etiqueta que dice que no hay productos
        // Si el total de Elementos es > 0 ocultamos el icono del centro del layout

        // Accedemos al total de elementos de la lista producto pasando el hash de la lista
        int TotalElementosListaProducto = BD.fnc_get_All_T_LISTA_PRODUCTO(ListaHASH).size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Total Registros LISTA_PRODUCTOS: " + TotalElementosListaProducto);

        // Si el total de Elementos es > 0 ocultamos el icono del centro del layout
        if (TotalElementosListaProducto > 0) {
            ImageView icono_centro = (ImageView) findViewById(R.id.empty_prod);
            icono_centro.setVisibility(View.INVISIBLE);
            // Tener en cuenta esto para incluirlo al borrar un elemento
        } else {
            ImageView icono_centro = (ImageView) findViewById(R.id.empty_prod);
            icono_centro.setVisibility(View.VISIBLE);
            // Tener en cuenta esto para incluirlo al borrar un elemento
        }

        // Desactivar el teclado nada más entrar para que no aparezca
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // Cargamos el Contexto
        context = getApplicationContext();

        // Get album id
        Intent mainIntent = getIntent();
        // Obtenemos el id del elemento seleccionado en la actividad anterior
        shopping_list_Item_Selected = mainIntent.getIntExtra("shopping_list_Item_Selected", 0);
        shopping_list_Item_Count = mainIntent.getStringExtra("shopping_list_Item_Count");
        shopping_list_Item_HASH = mainIntent.getStringExtra("shopping_list_Item_HASH");

        c_logging.getInstance().log(c_logging.LOG_INFO, "Lista ItemSelected_Selected: " + shopping_list_Item_Selected);
        c_logging.getInstance().log(c_logging.LOG_INFO, "Lista ItemSelected_Count: " + shopping_list_Item_Count);
        c_logging.getInstance().log(c_logging.LOG_INFO, "Lista ItemSelected_HASH: " + shopping_list_Item_HASH);

        // Obtenemos el nombre del elemento seleccionado en la actividad anterior
        // En este caso nos traemos el HASH y con eso obtenemos el a través de la Base de Datos el nombre
        ListaHASH = mainIntent.getStringExtra("shopping_list_Item_HASH");
        c_logging.getInstance().log(c_logging.LOG_INFO, "Lista HASH: " + ListaHASH);

        // Base de Datos
        BD = new c_bd_handler(context);

        // Inicializamos la BD
        BD.fnc_bd_handler_init(context);

        // Accedemos al total de elementos de la lista producto pasando el hash de la lista
        int TotalElementosListaProducto = BD.fnc_get_All_T_LISTA_PRODUCTO(ListaHASH).size();
        c_logging.getInstance().log(c_logging.LOG_INFO, "Total Registros LISTA_PRODUCTOS: " + TotalElementosListaProducto);

        // Una vez que sabemos el núemro de elementos de una lista debemos obtener su nombre para ponerlo
        // en la cabecera de la actividad
        shopping_list_Item_Title = BD.fnc_getT_LISTA_ADES_LARGA(ListaHASH);

        // Cambiamos el título de la actividad
        setTitle( shopping_list_Item_Title);

        setContentView(R.layout.l_shopping_list_prod);

        // Si el total de Elementos es > 0 ocultamos el icono del centro del layout
        if (TotalElementosListaProducto > 0) {
            ImageView icono_centro = (ImageView) findViewById(R.id.empty_prod);
            icono_centro.setVisibility(View.INVISIBLE);
            // Tener en cuenta esto para incluirlo al borrar un elemento
        } else {
            ImageView icono_centro = (ImageView) findViewById(R.id.empty_prod);
            icono_centro.setVisibility(View.VISIBLE);
            // Tener en cuenta esto para incluirlo al borrar un elemento
        }

        // Matriz Bidimensional
        // Matriz de n Elementos y 8 columnas, el total de características de cada lista de productos
        String[][] MatrizBidimensional = new String[TotalElementosListaProducto][6];
        MatrizBidimensional = BD.fnc_export_lista_producto(TotalElementosListaProducto, ListaHASH);

        // Recargamos la lista
        c_logging.getInstance().log(c_logging.LOG_INFO, "Creando lista productos");
        setListAdapter(new c_shopping_list_product_adapter(this, TotalElementosListaProducto, MatrizBidimensional));

        // Desactivar el teclado nada más entrar para que no aparezca
        getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

        registerForContextMenu(getListView());
    }

    public void onListItemClick(ListView parent, View v, int position, long id) {
        c_logging.getInstance().log(c_logging.LOG_INFO, "List Click... ITEM --> " + position);

        // Lanzamos la actividad de la lista de elementos de la compra
        //Intent mainIntent = new Intent().setClass(c_shopping_list.this, c_shopping_list_prod.class);
        //startActivity(mainIntent);

    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

        if (keyCode == KeyEvent.KEYCODE_BACK) {
            c_logging.getInstance().log(c_logging.LOG_INFO, getString(R.string.st_la_Exit));

            Intent intent = new Intent();
            intent.putExtra("RETURN_ACTIVITY", "return_activity_c_shopping_list");
            setResult(RETURN_CODE_OK, intent);

            this.onBackPressed();
            return false;
        }
        // para las demas cosas, se reenvia el evento al listener habitual
        return super.onKeyDown(keyCode, event);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.m_shopping_list_prod, menu);
        return (super.onCreateOptionsMenu(menu));
    }

    /* Creates the menu items */
    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {

        super.onCreateContextMenu(menu, v, menuInfo);

        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.m_shopping_list_prod_context, menu);

        // Título del menú contextual
        menu.setHeaderTitle( "Producto: " + shopping_list_Item_Title );

        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) menuInfo;
        Adapter adapter = getListAdapter();

        /*
        Del c_shopping_list_product_apdatper:
        String KEY_NCOD_TOTAL_PRODUCTOS = this.MatrizBidimensional[position][0];
        String KEY_NCOD_INTERNO = this.MatrizBidimensional[position][1];
        String KEY_ADES_LARGA = this.MatrizBidimensional[position][2];
        String KEY_ADES_HASH = this.MatrizBidimensional[position][3];
        String KEY_DFEC_CREACION = this.MatrizBidimensional[position][4];
        String KEY_DFEC_UPDATED = this.MatrizBidimensional[position][5];

         */
        String []  listview_product = (String []) adapter.getItem(info.position);
        shopping_list_Product_Selected = listview_product[2];

        // Título del menu contextual
        menu.setHeaderTitle( "Producto: " + shopping_list_Product_Selected );

        c_logging.getInstance().log(c_logging.LOG_INFO,  "Item List Product selected KEY_NCOD_TOTAL_PRODUCTOS: " + listview_product[0]);
        c_logging.getInstance().log(c_logging.LOG_INFO,  "Item List Product selected KEY_NCOD_INTERNO: " + listview_product[1]);
        c_logging.getInstance().log(c_logging.LOG_INFO,  "Item List Product selected KEY_ADES_LARGA: " + listview_product[2]);
        c_logging.getInstance().log(c_logging.LOG_INFO,  "Item List Product selected KEY_ADES_HASH: " + listview_product[3]);
        c_logging.getInstance().log(c_logging.LOG_INFO,  "Item List Product selected KEY_DFEC_CREACION: " + listview_product[4]);
        c_logging.getInstance().log(c_logging.LOG_INFO,  "Item List Product selected KEY_DFEC_UPDATED: " + listview_product[5]);

        shopping_list_Product_Selected_hash = listview_product[3];
        shopping_list_Product_Selected_hash_count = Integer.parseInt(listview_product[0]);

    }

    private void PRC_Borrar_Producto ( String pListaHASH, String pProductoHASH, int pProductoCount ) {

        // Hay que ver la relación entre los productos y las lista antes de poder borrar algún producto

        // Antes de borrar nos quedamos con el total de elementos del producto para poder restarlo de la lista global
        // Está almacenado en la variable pProductoCount

        c_logging.getInstance().log(c_logging.LOG_INFO,  "Borrar: LISTA: " + pListaHASH + " PRODUCTO: " + pProductoHASH + " CountProducto: " + pProductoCount );

        // Borramos la relación LISTA - PRODUCTO
        BD.fnc_Borrar_Producto_Lista ( pListaHASH, pProductoHASH );

        // Actualizamos la "lista" descontando los elementos borrados
        // Hay que tener la precaución de que no quede en -1
        // Obtenemos el total de elementos de una lista
        int ListaCount = BD.fnc_get_lista_count ( pListaHASH );

        // Actualizamos el contador de la lista
        c_logging.getInstance().log(c_logging.LOG_INFO,  "ANTES: ListaCount: " + ListaCount );
        ListaCount = ListaCount - pProductoCount;
        c_logging.getInstance().log(c_logging.LOG_INFO,  "DESPUES: ListaCount: " + ListaCount );

        if (ListaCount < 0 ) {
            ListaCount = 0;
        }

        BD.fnc_update_table_lista ( pListaHASH, ListaCount );

        // Borramos los productos que se hayan quedado huérfanos
        BD.fnc_Delete_Producto_Huerfano ( pProductoHASH );
    }


    /* Handles item selections */
    @Override
    public boolean onContextItemSelected(MenuItem item) {

        AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();

        // Perform action according to selected item from context menu
        switch (item.getItemId()) {

            case R.id.m_sl_menu_delete_item:
                // Show message
                c_logging.getInstance().log(c_logging.LOG_INFO, " BORRAR ID " + menuInfo.id + ", position " + menuInfo.position + " item_string " + item.toString());

                // Borramos un producto de una lista
                // Lista -> shopping_list_Item_HASH
                // Producto -> shopping_list_Product_Selected_hash
                this.PRC_Borrar_Producto ( shopping_list_Item_HASH, shopping_list_Product_Selected_hash, shopping_list_Product_Selected_hash_count );

                // Pintamos la pantalla - Refresh

                // Accedemos al total de elementos de la lista producto pasando el hash de la lista
                int TotalElementosListaProducto = BD.fnc_get_All_T_LISTA_PRODUCTO(ListaHASH).size();
                c_logging.getInstance().log(c_logging.LOG_INFO, "Total Registros LISTA_PRODUCTOS: " + TotalElementosListaProducto);

                // Si el total de Elementos es > 0 ocultamos el icono del centro del layout
                if (TotalElementosListaProducto > 0) {
                    ImageView icono_centro = (ImageView) findViewById(R.id.empty_prod);
                    icono_centro.setVisibility(View.INVISIBLE);
                    // Tener en cuenta esto para incluirlo al borrar un elemento
                } else {
                    ImageView icono_centro = (ImageView) findViewById(R.id.empty_prod);
                    icono_centro.setVisibility(View.VISIBLE);
                    // Tener en cuenta esto para incluirlo al borrar un elemento
                }

                // Matriz Bidimensional
                // Matriz de n Elementos y 7 columnas (0 a 6), el total de características de cada producto
                int TotalProductosLista_despues = BD.fnc_get_All_T_LISTA_PRODUCTO(ListaHASH).size();
                String[][] MatrizBidimensional = new String[TotalProductosLista_despues][6];
                MatrizBidimensional = BD.fnc_export_lista_producto(TotalProductosLista_despues, ListaHASH);

                // Recargamos la lista
                // Ponemos más uno para que
                setListAdapter(new c_shopping_list_product_adapter(this, TotalProductosLista_despues, MatrizBidimensional));

                // Desactivar el teclado nada más entrar para que no aparezca
                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

                break;
        }

        //return true;
        return super.onContextItemSelected(item);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId()) {
            case R.id.m_st_sl_pd_action_add_producto:
                PRC_Anadir_Producto();
                c_logging.getInstance().log(c_logging.LOG_INFO, "add");
                return false;
            case R.id.m_st_sl_pd_action_del_lista:
                c_logging.getInstance().log(c_logging.LOG_INFO, "del");
                return false;
            case R.id.m_st_sl_pd_action_back:
                c_logging.getInstance().log(c_logging.LOG_INFO, "back");
                Intent intent = new Intent();
                intent.putExtra("RETURN_ACTIVITY", "return_activity_c_shopping_list");
                setResult(RETURN_CODE_OK, intent);

                this.onBackPressed();
                return false;
        }
        return (super.onOptionsItemSelected(item));
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        // Save the user's current game state
        // Always call the superclass so it can save the view hierarchy state
        super.onSaveInstanceState(savedInstanceState);
    }

    protected void PRC_Anadir_Producto() {
        c_dialog_NewProducto fragment1 = new c_dialog_NewProducto();
        fragment1.mListener = c_shopping_list_prod.this;
        fragment1.show(getFragmentManager(), "dialogNewProducto");
    }


}
